home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
EnigmA Amiga Run 1998 January
/
EnigmA AMIGA RUN 24 (1997)(G.R. Edizioni)(IT)[!][issue 1998-01 & 02].iso
/
LISTATI
/
asldemo.c
< prev
next >
Wrap
C/C++ Source or Header
|
1997-12-10
|
8KB
|
230 lines
//**********************************************************************
//* *
//* Algoritmo per l'apertura di un asl requester *
//* Il programma funziona solo sotto O.S. 3.0 o superiore. *
//* Se avete un programma che "patcha" l'asl library possono nascere *
//* problemi per la corretta visualizzazione e utilizzo dei file, *
//* quindi per vedere il tutto funzionare correttamente dovrete *
//* disabilitarlo. *
//* *
//**********************************************************************
#include <stdio.h>
#include <exec/memory.h>
#include <exec/types.h>
#include <dos/dosasl.h>
#include <intuition/intuition.h>
#include <libraries/asl.h>
#include <string.h>
#include <clib/exec_protos.h>
#include <clib/intuition_protos.h>
#include <clib/asl_protos.h>
extern struct IntuitionBase *intuibase;
struct Library *aslbase=NULL;
//
// Definizione delle funzioni
//
ULONG FunzioneHook();
//
// Inizio programma
//
int main (int argc,char **argv)
{
int i = 0;
struct FileRequester *my_asl_req =NULL;
struct Window *finestra =NULL;
struct Screen *schermo =NULL;
//
// Apriamo le libreria asl
//
if ((aslbase=OpenLibrary("asl.library",39L))==NULL)return(-2);
if ((my_asl_req=AllocAslRequestTags(ASL_FileRequest,TAG_END)))
{
//
// Apriamo ora il file requester più semplice di tutti
//
if (AslRequestTags(my_asl_req,TAG_END))
{
if (strlen(my_asl_req->fr_File))
{// stampiamo il nome del file selezionato
printf ("\n file selezionato: %s",my_asl_req->fr_File);
if(strlen(my_asl_req->fr_Drawer))printf("\n percorso: %s \n",my_asl_req->fr_Drawer);
}
}
else printf ("\n NON avete selezionato nulla \n");
//
// Facciamo ora un pò di multiselezione ...
// Nota:i tags,a meno che no si dia una "ripulita" alla struttura
// FileRequester, sono cumulabili. Ad esempio una volta settato
// "ASLFR_DoMultiSelect" questo tag resterà valido anche per le
// prossime finestre ASL che apriremo, non solo per quella corrente.
//
if (AslRequestTags(my_asl_req,
ASLFR_DoMultiSelect, TRUE,
ASLFR_InitialFile, "",
TAG_END))
{
if (my_asl_req->fr_NumArgs)
{//stampiamo tutti i files selezionati
if(strlen(my_asl_req->fr_Drawer))printf("\n percorso: %s \n",my_asl_req->fr_Drawer);
for(i=0;i<my_asl_req->fr_NumArgs;i++)
printf("\n file %d: %s",i+1,my_asl_req->fr_ArgList[i].wa_Name);
}
}
else printf ("\n NON avete selezionato nulla \n");
//
// Sempre più difficile! Nell'ordine:
// Titolo finestra personalizzato,
// tasti "OK" e "ANNULLA" personalizzati ,directory e file di
// partenza ,multiselezione,Funzione filtro attiva.
//
if (AslRequestTags(my_asl_req,
ASLFR_TitleText, "Sempre più personalizzata!",
ASLFR_PositiveText, "Va ben!",
ASLFR_NegativeText, "Va Via!",
ASLFR_InitialDrawer, "c:",
ASLFR_InitialFile, "",
ASLFR_DoMultiSelect, TRUE,
ASLFR_InitialPattern,"D#?",
ASLFR_DoPatterns,TRUE,
TAG_END));
//
// Supponete di avere un programma ,che gira su finestra ,con
// un bel gadgettino che serve a salvare il lavoro che avete fatto.
// Sta per scoppiare la guerra termonucleare e voi per la fretta
// ci cliccate sopra trecentomila volte in un secondo.
// Se il programma è strutturato in una certa maniera appariranno
// contemporaneamente su schermo trecentomila filerequester
// che chiedono di salvare il frutto dei vostri sforzi.
// Con un solo tag possiamo evitare tutto questo!
// Apriamo ora una finestra e settiamo il tag per far comparire
// il puntatore di attesa quando riclicchiamo sopra la stessa.
// (Andiamo in modalità salvataggio).
//
if((finestra=OpenWindowTags(NULL,
WA_Top,20, WA_Left,20, WA_Width,400, WA_Height,100,
WA_Title,"Finestra per ASL",NULL)))
{
if (AslRequestTags(my_asl_req,
ASLFR_TitleText, "Clicca sulla finestra!",
ASLFR_Window, finestra,
ASLFR_SleepWindow, TRUE,
ASLFR_PositiveText, "Salva",
ASLFR_NegativeText, "Ci ripenso!",
ASLFR_DoMultiSelect,FALSE,
ASLFR_DoSaveMode, TRUE,
ASLFR_SleepWindow, TRUE,
TAG_END));
CloseWindow(finestra);
}
FreeFileRequest(my_asl_req);
}// ripuliamo tutto quanto! Facciamo prima che a
// settare tutti i tag che non interessano a "FALSE"
if (my_asl_req=AllocAslRequestTags(ASL_FileRequest,TAG_END))
{
if (AslRequestTags(my_asl_req,
ASLFR_TitleText, "Solo Cassetti please!",
ASLFR_DrawersOnly, TRUE,
TAG_END));
//
// Apriamo ora l'asl su uno schermo.
// Gli altri tags oramai dovreste saperli
//
if ((schermo=OpenScreenTags(NULL,
SA_Width, 640,
SA_Height, 256,
SA_Depth, 4,
SA_DisplayID, HIRES,
SA_Title, "Schermo per ASL",
TAG_END)))
{
if (AslRequestTags(my_asl_req,
ASLFR_DrawersOnly, FALSE,
ASLFR_TitleText, "Uno schermo tutto mio!",
ASLFR_Screen, schermo,
ASLFR_DoPatterns, TRUE,
ASLFR_DoMultiSelect,TRUE,
TAG_END));
CloseScreen(schermo);
}
FreeFileRequest(my_asl_req);
} //
// Vediamo ora di utilizzare la funzione Hook definita sotto.
//
if (my_asl_req=AllocAslRequestTags(ASL_FileRequest,NULL))
{
if((finestra=OpenWindowTags(NULL,
WA_Top, 20,
WA_Left, 20,
WA_Width, 400,
WA_Height, 100,
WA_Title, "Finestra per ASL 2 (con hook)",
WA_DragBar, TRUE,
WA_CloseGadget, TRUE,
WA_DepthGadget, TRUE,
WA_IDCMP, IDCMP_RAWKEY|IDCMP_DISKINSERTED|IDCMP_CLOSEWINDOW|
IDCMP_ACTIVEWINDOW|IDCMP_DISKREMOVED,
TAG_END)))
{
if (AslRequestTags(my_asl_req,
ASLFR_TitleText, "Clicca sulla finestra!",
ASLFR_Window, finestra,
ASLFR_DoMultiSelect, TRUE,
ASLFR_InitialDrawer, "libs:",
ASLFR_HookFunc, ULONG(FunzioneHook),
ASLFR_Flags1, FRF_FILTERFUNC|FRF_INTUIFUNC,
TAG_END));
CloseWindow(finestra);
}
FreeFileRequest(my_asl_req);
}
CloseLibrary(aslbase);
return(0);
}
ULONG FunzioneHook(ULONG tipo,CPTR oggetto,struct FileRequester* file_req)
{
long dato,appo;
STRPTR nome_file=NULL;
switch (tipo)
{
case FOF_INTUIFUNC:
{ printf("Messaggio dalla finestra: ");
// Potremmo finire qui ma strafiamo pure...
dato=((struct IntuiMessage*)oggetto)->Class;
switch(dato)
{
case IDCMP_DISKINSERTED: printf("Inserito un disco!\n");break;
case IDCMP_DISKREMOVED: printf("Estratto un disco!\n");break;
case IDCMP_CLOSEWINDOW: printf("Finestra da chiudere!\n");break;
case IDCMP_ACTIVEWINDOW: printf("Finestra attivata\n");break;
case IDCMP_RAWKEY: printf("premuto un tasto\n");break;
default: printf("Messaggio sconosciuto!\n");break;
}
return(oggetto);
}
case FOF_FILTERFUNC:
{
nome_file=((struct AnchorPath*)oggetto)->ap_Info.fib_FileName;
// la struttura AnchorPath è definita in "dos/dosasl.h"
printf("AslFR: esamino la stringa %s\n",nome_file);
appo=strlen(nome_file);
dato=0;
while(dato<appo)
{
if ((nome_file[dato]=='c')|(nome_file[dato++]=='C'))return(FALSE);
// Ricordate che in caso di successo qui si deve uscire con "FALSE"
}
return(TRUE); // No ci sono "c" nella stringa, pekkato!
}
default:printf("\nTipo oggetto non gestito\n");
}
return(TRUE);
}